import 'package:microbject/core/runtime/lang/date_util.dart';
import 'package:microbject/core/runtime/lang/logger_enum.dart';
import 'package:microbject/core/runtime/lang/logger_info.dart';
import 'package:microbject/core/runtime/lang/logger_speed_type.dart';
import 'package:microbject/core/runtime/lang/speed.dart';
import 'package:microbject/core/runtime/lang/string_data.dart';
import 'package:microbject/core/runtime/lang/string_util.dart';

/**
 * 速度类型。
 */
// export type LoggerSpeedType = number | Speed;

/**
 * 日志工具类。
 */
class LoggerUtil {
  // /**
  //  * 日志版本。
  //  *
  //  * @deprecated
  //  * @certify 220326
  //  */
  // public static version: number = 1;

  /// 输出信息
  static bool outputInfo = true;

  /// 输出日期
  static bool outputDate = true;

  // /**
  //  * 输出线程。
  //  *
  //  * @certify 220424
  //  */
  // public static outputThread: boolean = true;

  // 输出级别
  static bool outputLevel = true;

  /// 输出函数
  static bool outputMethod = true;

  // /**
  //  * 开启调式标志。
  //  *
  //  * @certify 220326
  //  */
  // public static debugAble: boolean = false;

  // /**
  //  * 开启信息标志。
  //  *
  //  * @certify 220326
  //  */
  // public static infoAble: boolean = true;

  // /**
  //  * 开启警告标志。
  //  *
  //  * @certify 220326
  //  */
  // public static warnAble: boolean = true;

  // /**
  //  * 开启错误标志。
  //  *
  //  * @certify 220326
  //  */
  // public static errorAble: boolean = true;

  // /**
  //  * 开启致命标志。
  //  *
  //  * @certify 220326
  //  */
  // public static fatalAble: boolean = true;

  // /** 日志标志 */
  // public static debugCount: number = 0;
  // public static infoCount: number = 0;
  // public static warnCount: number = 0;

  // /**
  //  * 错误计数。
  //  *
  //  * @certify 220424
  //  */
  // public static errorCount: number = 0;

  // public static fatalCount: number = 0;

  /// 标签长度
  static int LabelLength = 40;
  // /** 分割符 */
  // public static Tab: string = '   ';

  // /**
  //  * 分割符1。
  //  *
  //  * @certify 220423
  //  */
  // public static Splitter1: string = '------------------------------------------------------------';

  // /**
  //  * 分割符2。
  //  *
  //  * @certify 220423
  //  */
  // public static Splitter2: string = '============================================================';

  // /**
  //  * 分割符3。
  //  *
  //  * @certify 220423
  //  */
  // public static Splitter3: string = '************************************************************';

  // /** 输出监听集合 */
  // protected static _outputListeners: Listeners;
  // /** 日志缓冲 */
  // protected static _logger: LoggerItem = new LoggerItem();

  // /**
  //  * 获得输出监听集合。
  //  *
  //  * @certify 220326
  //  * @return 输出监听集合
  //  */
  // public static get outputListeners(): Listeners {
  //    var listeners = LoggerUtil._outputListeners;
  //    if (!listeners) {
  //       listeners = LoggerUtil._outputListeners = new Listeners();
  //    }
  //    return listeners;
  // }

  // /**
  //  * 从字符串中截取指定长度的字符串。
  //  *
  //  * @certify 220423
  //  * @param value 字符串对象
  //  * @param length 长度
  //  * @return 截取后的部分字符串
  //  */
  // public static format(value: string, length: number = 1024): string {
  //    var result = null;
  //    if (value) {
  //       if (value.constructor == String) {
  //          if (value.length > length) {
  //             result = value.substring(0, length);
  //          } else {
  //             result = value;
  //          }
  //       } else {
  //          result = '[object]';
  //       }
  //    } else {
  //       result = '[null]';
  //    }
  //    return result;
  // }

  // /**
  //  * 日志输出信息。
  //  *
  //  * @param sender 发送者
  //  * @param event 事件
  //  */
  // public static onLogger(sender: ListenerContext, event: EventObject): void {
  //    var logger = event.content as LoggerItem;
  //    if (logger) {
  //       var description = logger.description;
  //       switch (logger.levelCd) {
  //          case LoggerEnum.Fatal:
  //          case LoggerEnum.Error:
  //             console.error(description);
  //             break;
  //          case LoggerEnum.Warn:
  //             console.warn(description);
  //             break;
  //          case LoggerEnum.Info:
  //             console.info(description);
  //             break;
  //          default:
  //             console.log(description);
  //       }
  //    }
  // }

  /**
   * 输出日志信息。
   *
   * @param linker 关联对象
   * @param sender 发送者
   * @param record 记录
   * @param levelCd 级别
   * @param moduleName 模块名称
   * @param processName 处理名称
   * @param processId 处理编号
   * @param method 函数
   * @param tick 时刻
   * @param message 消息
   * @param parameters 参数集合
   * @param exception
   */
  static void output(LoggerInfo info) {
    var message = info.message;
    // 获得函数名称
    var classShortName = '';
    //    var classFullName = null;
    //    if (sender) {
    //       classShortName = MethodUtil.fastShortName(sender.constructor);
    //       classFullName = MethodUtil.fastFullName(sender.constructor);
    //    }
    //    var methodName = null;
    //    if (method) {
    //       if (typeof method == 'string') {
    //          methodName = method;
    //       } else if (linker) {
    //          for (var senderName in sender) {
    //             if (sender[senderName] == method) {
    //                methodName = senderName;
    //                break;
    //             }
    //          }
    //       }
    //    }
    //    if (classShortName == null) {
    //       classShortName = 'unknown';
    //    } else {
    //       classShortName = classShortName.replace('_', '.');
    //    }
    //    if (sender && sender.hashCode) {
    //       classShortName += '@' + sender.hashCode;
    //    }
    //    if (methodName) {
    //       classShortName += '.' + methodName;
    //    }
    String tickCode = ' ';
    int span = info.span;
    if (span > 0) {
      tickCode += span.toString() + 'ms';
    }
    // 格式化参数
    var result = StringData();
    //    // result.append('(v');
    //    // result.append(RuntimeUtil.version);
    //    // result.append(') ');
    if (LoggerUtil.outputInfo && LoggerUtil.outputDate) {
      result.append(DateUtil.format(DateTime.now(), 'yymmdd-hh24miss.ms'));
      result.append('|');
    }
    //    if (LoggerUtil.outputInfo && LoggerUtil.outputThread) {
    //       var threadId = ProcessUtil.threadId;
    //       if (threadId > 0) {
    //          result.append(StringUtil.toUpper(StringUtil.padLeft(threadId.toString(16), 4, '0')));
    //       } else {
    //          result.append(ProcessUtil.threadCode);
    //       }
    //       result.append('|');
    //    }
    if (LoggerUtil.outputInfo && LoggerUtil.outputLevel) {
      result.append(info.levelCd.code);
      result.append(' ');
    }
    if (LoggerUtil.outputInfo && LoggerUtil.outputMethod) {
      result.append('[ ');
      result.append(StringUtil.padRight(
          classShortName, LoggerUtil.LabelLength - tickCode.length));
      result.append(tickCode);
      result.append(' ] ');
    }
    //    var formatMessage = StringUtil.nvl(message);
    //    var parametersStrings = null;
    //    if (parameters instanceof Array) {
    var formatMessage = info.message;
    var parameters = info.parameters;
    if ((formatMessage != null) && (parameters != null)) {
      int count = parameters.length;
      //       parametersStrings = new Array<any>();
      for (var i = 0; i < count; i++) {
        var parameter = parameters[i];
        String value = '';
        if (parameter != null) {
          if (parameter is String) {
            value = parameter;
          } else {
            value = parameter.toString();
          }
          // if (typeof(parameter) == 'function') {
          // value = MethodUtil.fastFullName(parameter);
          // } else {
          // }
        }
        //          parametersStrings.push(value);
        //          if (formatMessage.replace) {
        int paramIndex = i + 1;
        String paramIndexString = paramIndex.toString();
        String key = '{' + paramIndexString + '}';
        formatMessage = formatMessage!.replaceAll(key, value);
      }
      //          }
      result.append(formatMessage!);
    }
    //    } else {
    //       parametersStrings = new Object() as any;
    //       var paramSource = '';
    //       for (var paramName in parameters) {
    //          var paramValue = parameters[paramName];
    //          var value = '';
    //          if (parameter != null) {
    //             if (typeof (parameter) == 'function') {
    //                value = MethodUtil.fastFullName(parameter);
    //             } else {
    //                value = parameter.toString();
    //             }
    //          }
    //          parametersStrings[paramName] = paramValue;
    //          if (formatMessage.replace) {
    //             formatMessage = formatMessage.replace('${' + paramName + '}', paramValue);
    //          }
    //          // 生成显示代码
    //          if (paramSource.length > 0) {
    //             paramSource += ', ';
    //          }
    //          paramSource += paramName + '=' + paramValue;
    //       }
    //       formatMessage += ' (' + paramSource + ')';
    //    }
    //    result.append(formatMessage);
    //    // 获得堆栈
    //    if (levelCd as any >= LoggerEnum.Error) {
    //       if (exception instanceof Error) {
    //          var errorName = exception.name;
    //          var errorMessage = exception.message;
    //          if (StringUtil.isNotEmpty(errorName) && StringUtil.isNotEmpty(errorMessage)) {
    //             var errorInfo = StringUtil.format(' (error={1}, message={2})', errorName, errorMessage);
    //             result.append(errorInfo);
    //          }
    //          ProcessUtil.parseStack(exception.stack, 0, 99, logger.stacks.memory);
    //       } else {
    //          try {
    //             throw new Error();
    //          } catch (error) {
    //             ProcessUtil.parseStack(error.stack, 3, 99, logger.stacks.memory);
    //          }
    //       }
    //    } else {
    //       var runStack = new ProcessStack();
    //       runStack.threadName = ProcessUtil.threadCode;
    //       runStack.className = classFullName;
    //       runStack.methodName = methodName;
    //       logger.stacks.push(runStack);
    //    }
    var description = result.toString();
    // 日志输出
    //    logger.record = record;
    //    logger.version = LoggerUtil.version;
    //    logger.sender = sender;
    //    logger.date = DateUtil.format('yymmddhh24missms');
    //    logger.threadCode = ProcessUtil.threadCode;
    //    logger.moduleName = moduleName;
    //    logger.processName = processName;
    //    logger.processId = processId;
    //    logger.levelCd = levelCd;
    //    logger.message = message;
    //    logger.parameters = parametersStrings;
    //    logger.description = description;
    //    logger.error = exception;
    //    var event = MemoryUtil.alloc(EventObject) as EventObject;
    //    event.content = logger;
    //    LoggerUtil.outputListeners.process(event);
    //    MemoryUtil.free(event);
    //    // 返回内容
    //    return outputMessage;
    print(description);
  }

  // /**
  //  * 显示一个弹出信息。
  //  *
  //  * @deprecated
  //  * @certify 220423
  //  * @param owner 消息对象
  //  * @param message 消息内容
  //  * @param parameters 参数集合
  //  */
  // public static show(owner: any, message: string, ...parameters: Array<any>): void {
  //    var result = LoggerUtil.output(null, owner, false, LoggerEnum.Debug, null, null, null, null, 0, null, message, parameters);
  //    alert(result);
  // }

  // /**
  //  * 显示一个调试信息。
  //  *
  //  * @param linker 关联对象
  //  * @param owner 消息对象
  //  * @param record 记录
  //  * @param tick 时刻
  //  * @param message 消息内容
  //  * @param parameters 参数集合
  //  */
  // public static processDebug(linker: any, owner: any, record: boolean, tick: LoggerSpeedType, message: string, parameters: Array<any>): void {
  //    if (LoggerUtil.debugAble) {
  //       LoggerUtil.debugCount++;
  //       LoggerUtil.output(linker, owner, record, LoggerEnum.Debug, null, null, null, null, tick, null, message, parameters);
  //    }
  // }

  /// 显示一个调试信息。
  ///
  /// @param owner 消息对象
  /// @param message 消息内容
  /// @param parameters 参数集合
  static void debug(Object? owner, String message, List<dynamic>? parameters) {
    var info = LoggerInfo();
    info.sender = owner;
    info.levelCd = LoggerEnum.debug;
    info.message = message;
    info.parameters = parameters;
    LoggerUtil.output(info);
  }

  // /**
  //  * 显示一个调试信息。
  //  *
  //  * @param owner 消息对象
  //  * @param method 函数名称
  //  * @param message 消息内容
  //  * @param parameters 参数集合
  //  */
  // public static printDebug(owner: any, method: string, message: string, ...parameters: Array<any>): void {
  //    if (LoggerUtil.debugAble) {
  //       LoggerUtil.debugCount++;
  //       LoggerUtil.output(null, owner, false, LoggerEnum.Debug, null, null, null, method, 0, null, message, parameters);
  //    }
  // }

  /// 显示一个调试信息。
  ///
  /// @param owner 消息对象
  /// @param tick 运行时刻
  /// @param message 消息内容
  /// @param parameters 参数集合
  static void debugTick(
      Object? owner, dynamic tick, String message, List<dynamic>? parameters) {
    var info = LoggerInfo();
    info.sender = owner;
    info.levelCd = LoggerEnum.debug;
    if (tick is Speed) {
      info.span = tick.record();
    }
    info.message = message;
    info.parameters = parameters;
    LoggerUtil.output(info);
  }

  // /**
  //  * 显示一个提示信息。
  //  *
  //  * @param linker 关联对象
  //  * @param owner 消息对象
  //  * @param record 记录
  //  * @param moduleName 模块名称
  //  * @param processName 处理名称
  //  * @param processGuid 处理编号
  //  * @param method 函数
  //  * @param tick 时刻
  //  * @param message 消息内容
  //  * @param parameters 参数集合
  //  */
  // public static processInfo(linker: any, owner: any, record: boolean, moduleName: string, processName: string, processGuid: string, method: Function, tick: LoggerSpeedType, message: string, parameters: Array<any>): void {
  //    if (LoggerUtil.infoAble) {
  //       LoggerUtil.infoCount++;
  //       LoggerUtil.output(linker, owner, record, LoggerEnum.Info, moduleName, processName, processGuid, method, tick, null, message, parameters);
  //    }
  // }

  // /**
  //  * 显示一个提示信息。
  //  *
  //  * @certify 220325
  //  * @param owner 消息对象
  //  * @param message 消息内容
  //  * @param parameters 参数集合
  //  */
  // public static info(owner: any, message: string, ...parameters: Array<any>): void {
  //    LoggerUtil.processInfo(null, owner, false, null, null, null, null, 0, message, parameters);
  // }

  // /**
  //  * 显示一个警告信息。
  //  *
  //  * @deprecated
  //  * @certify 220424
  //  * @param owner 消息对象
  //  * @param method 函数
  //  * @param message 消息内容
  //  * @param parameters 参数集合
  //  */
  // public static printInfo(owner: any, method: string, message: string, ...parameters: Array<any>): void {
  //    if (LoggerUtil.infoAble) {
  //       LoggerUtil.infoCount++;
  //       LoggerUtil.output(null, owner, false, LoggerEnum.Info, null, null, null, method, 0, null, message, parameters);
  //    }
  // }

  // /**
  //  * 显示一个提示信息。
  //  *
  //  * @certify 220327
  //  * @param owner 消息对象
  //  * @param tick 运行时刻
  //  * @param message 消息内容
  //  * @param parameters 参数集合
  //  */
  // public static infoTick(owner: any, tick: LoggerSpeedType, message: string, ...parameters: Array<any>): void {
  //    LoggerUtil.processInfo(null, owner, false, null, null, null, null, tick, message, parameters);
  // }

  // /**
  //  * 显示一个警告信息。
  //  *
  //  * @param linker 关联对象
  //  * @param owner 消息对象
  //  * @param record 记录
  //  * @param moduleName 模块名称
  //  * @param processName 处理名称
  //  * @param processGuid 处理编号
  //  * @param method 函数
  //  * @param tick 时刻
  //  * @param message 消息内容
  //  * @param parameters 参数集合
  //  */
  // public static processWarn(linker: any, owner: any, record: boolean, moduleName: string, processName: string, processGuid: string, method: Function, tick: number, message: string, parameters: Array<any>): void {
  //    if (LoggerUtil.warnAble) {
  //       LoggerUtil.warnCount++;
  //       LoggerUtil.output(linker, owner, record, LoggerEnum.Warn, moduleName, processName, processGuid, method, tick, null, message, parameters);
  //    }
  // }

  // /**
  //  * 显示一个警告信息。
  //  *
  //  * @certify 220325
  //  * @param owner 消息对象
  //  * @param message 消息内容
  //  * @param parameters 参数集合
  //  */
  // public static warn(owner: any, message: string, ...parameters: Array<any>): void {
  //    LoggerUtil.processWarn(null, owner, false, null, null, null, null, 0, message, parameters);
  // }

  // /**
  //  * 显示一个警告信息。
  //  *
  //  * @param owner 消息对象
  //  * @param method 函数
  //  * @param message 消息内容
  //  * @param parameters 参数集合
  //  */
  // public static printWarn(owner: any, method: string, message: string, ...parameters: Array<any>): void {
  //    if (LoggerUtil.warnAble) {
  //       LoggerUtil.warnCount++;
  //       LoggerUtil.output(null, owner, false, LoggerEnum.Warn, null, null, null, method, 0, null, message, parameters);
  //    }
  // }

  // /**
  //  * 显示一个错误信息。
  //  *
  //  * @param linker 关联对象
  //  * @param owner 消息对象
  //  * @param record 记录
  //  * @param moduleName 模块名称
  //  * @param processName 处理名称
  //  * @param processId 处理编号
  //  * @param method 函数
  //  * @param tick 时刻
  //  * @param message 消息内容
  //  * @param parameters 参数集合
  //  */
  // public static processError(linker: any, owner: any, record: boolean, moduleName: string, processName: string, processId: string, method: Function, tick: number, error: any, message: string, parameters: Array<any>): void {
  //    if (LoggerUtil.errorAble) {
  //       LoggerUtil.errorCount++;
  //       LoggerUtil.output(linker, owner, record, LoggerEnum.Error, moduleName, processName, processId, method, tick, error, message, parameters);
  //    }
  // }

  // /**
  //  * 显示一个错误信息。
  //  *
  //  * @certify 220325
  //  * @param owner 消息对象
  //  * @param message 消息内容
  //  * @param parameters 参数集合
  //  */
  // public static error(owner: any, error: ErrorType, message: string, ...parameters: Array<any>): void {
  //    LoggerUtil.processError(null, owner, false, null, null, null, null, 0, error, message, parameters);
  // }

  // /**
  //  * 显示一个例外信息。
  //  *
  //  * @param linker 关联对象
  //  * @param owner 消息对象
  //  * @param record 记录
  //  * @param moduleName 模块名称
  //  * @param processName 处理名称
  //  * @param processGuid 处理编号
  //  * @param method 函数
  //  * @param tick 时刻
  //  * @param error 例外对象
  //  * @param message 消息内容
  //  * @param parameters 消息参数列表
  //  */
  // public static processFatal(linker: any, owner: any, record: boolean, moduleName: string, processName: string, processGuid: string, method: Function, tick: number, error: any, message: string, parameters: Array<any>): void {
  //    if (LoggerUtil.fatalAble) {
  //       LoggerUtil.fatalCount++;
  //       LoggerUtil.output(linker, owner, record, LoggerEnum.Fatal, moduleName, processName, processGuid, method, tick, error, message, parameters);
  //    }
  //    // 建立函数调用关系的堆栈
  //    // var stack = new StringBuffer();
  //    // var stacks = new Array();
  //    // //var caller = RLogger.fatal.caller;
  //    // //while (caller) {
  //    // //   if (RArray.contains(stacks, caller)) {
  //    // //      break;
  //    // //   }
  //    // //   stacks.push(caller);
  //    // //   caller = caller.caller;
  //    // //}
  //    // var count = stacks.length;
  //    // for (var i = 0; i < count; i++) {
  //    //    //caller = stacks[i];
  //    //    if (i > 0) {
  //    //       stack.appendLine();
  //    //    }
  //    //    //stack.append('   ' + (count - i) + ': ' + RMethod.shortName(caller));
  //    // }
  //    // // 建立消息信息
  //    // var result = new StringBuffer();
  //    // //result.appendLine(RContext.get('RMessage:fatal'));
  //    // result.appendLine(StringUtil.repeat('-', 60));
  //    // result.append(ClassUtil.dump(owner), ': ');
  //    // if (message) {
  //    //    var count = arguments.length;
  //    //    for (var i = 3; i < count; i++) {
  //    //       var parameter = arguments[i];
  //    //       if ('function' == typeof (parameter)) {
  //    //          parameter = MethodUtil.shortName(parameter);
  //    //       }
  //    //       message = message.replace('{' + (i - 2) + '}', parameter);
  //    //    }
  //    // }
  //    // result.appendLine(message);
  //    // result.appendLine(StringUtil.repeat('-', 60));
  //    // result.appendLine('Stack:');
  //    // result.append(stack.flush());
  //    // var text = result.flush();
  //    // o.output(owner, text);
  //    // 显示信息
  //    // if (RuntimeUtil.isPlatformPc() && !RuntimeUtil.isRelease()) {
  //    // throw new Error(text);
  //    // }
  // }

  // /**
  //  * 显示一个例外信息。
  //  *
  //  * @certify 220325
  //  * @param owner 消息对象
  //  * @param error 例外对象
  //  * @param message 消息内容
  //  * @param parameters 参数集合
  //  */
  // public static fatal(owner: any, error: ErrorType, message: string, ...parameters: Array<any>): void {
  //    debugger
  //    LoggerUtil.processFatal(null, owner, false, null, null, null, null, 0, error, message, parameters);
  // }

  // /**
  //  * 默认配置处理。
  //  *
  //  * @certify 220424
  //  */
  // public static connectDefault(): void {
  //    LoggerUtil.debugAble = true;
  //    LoggerUtil.infoAble = true;
  //    LoggerUtil.warnAble = true;
  //    LoggerUtil.errorAble = true;
  //    LoggerUtil.fatalAble = true;
  //    LoggerUtil.outputListeners.register(LoggerUtil, LoggerUtil.onLogger);
  // }
}
